/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rpt.bd.cenario;

import java.awt.Component;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import rpt.lib.relatorio.CRelatorioBasico;

/**
 *
 * @author Roberto
 */
/**************************************************************************/
/***                                                                    ***/
/**************************************************************************/
public class CPersistenciaBd /* implements IPertinenciaBd */ {

    protected CGlobal fGlobal;
    protected CConectorBd fConectorBd;
    //protected Connection fConnection = null;
    //protected Statement fStatment = null;
    protected String fNomeTabela = null;
    protected String fAliasTabela = null;
    protected boolean fDistinto = false;
    protected String fNomeChavePrimaria = null;
    protected String fValorChavePrimaria = null;
    protected CEstruturaRegistroBd fEstruturaRegistroBd = null;
    protected EStatusOperacao fStatusOperacao;
    protected CConjuntoDadosBd fConjuntoDadosBd;
    protected CPersistenciaBd fPertinenciaBdMestre = null;
    protected int[] fValoresIdMestre = null;
    protected String[] fNomesCampoMestre = null;
    protected String[] fNomesCampoDetalhe = null;
    protected String[] fComparacoes = null;
    protected String[] fNomesCampoMestreHeranca = null;
    protected String[] fNomesCampoDetalheHeranca = null;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CPersistenciaBd(final CGlobal aGlobal) {
        super();
        fGlobal = aGlobal;
        fConectorBd = fGlobal.getConectorBd();
        //fConnection = fConectorBd.getConnection();
        //fStatment = fConectorBd.getStatement();
        fStatusOperacao = EStatusOperacao.consulta;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CPersistenciaBd(
            final CGlobal aGlobal,
            final CEstruturaRegistroBd aEstruturaRegistroBd) {
        //
        this(aGlobal);
        setEstruturaRegistroBd(aEstruturaRegistroBd);
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    protected CEstruturaRegistroBd criarEstruturaRegistroBd() {
        return new CEstruturaRegistroBd(this);
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CEstruturaRegistroBd getEstruturaRegistroBd() {
        if (fEstruturaRegistroBd == null) {
            fEstruturaRegistroBd = criarEstruturaRegistroBd();
        }
        return fEstruturaRegistroBd;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    protected final void setEstruturaRegistroBd(final CEstruturaRegistroBd aEstruturaRegistroBd) {
        fEstruturaRegistroBd = aEstruturaRegistroBd;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public CGlobal getGlobal() {
        return fGlobal;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CConectorBd getConectorBd() {
        return fConectorBd;
    }

    /**
     * 
     * @return 
     */
    public boolean isDistinto() {
        return fDistinto;
    }

    /**
     * 
     */
    public void setDistinto(boolean fDistinto) {
        this.fDistinto = fDistinto;
    }

    
    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    private Statement criarStatement() {
        if (fGlobal == null) {
            return null;
        }
        CConectorBd c = fGlobal.getConectorBd();
        if (c == null) {
            return null;
        }
        return c.criarStatement();
        /*
        Connection c = fGlobal.getConectorBd().getConnection();
        if (c == null) return null;
        Statement vStatement = null;
        try {
        vStatement = c.createStatement();
        } catch (SQLException ex) {
        Logger.getLogger(CPersistenciaBd.class.getName()).log(Level.SEVERE, null, ex);
        }
        return vStatement;
         * 
         */
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void setMestre(
            final CPersistenciaBd aPertinenciaBdMestre,
            final String[] aNomesCampoMestre,
            final String[] aNomesCampoDetalhe,
            final String[] aComparacoes,
            final String[] aNomesCampoMestreHeranca,
            final String[] aNomesCampoDetalheHeranca) {
        fPertinenciaBdMestre = aPertinenciaBdMestre;
        fNomesCampoMestre = aNomesCampoMestre;
        fNomesCampoDetalhe = aNomesCampoDetalhe;
        fComparacoes = aComparacoes;
        fNomesCampoMestreHeranca = aNomesCampoMestreHeranca;
        fNomesCampoDetalheHeranca = aNomesCampoDetalheHeranca;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public void setMestre(final int[] aValoresIdMestre, final String[] aNomesCampoDetalhe) {
        fValoresIdMestre = aValoresIdMestre;
        fNomesCampoDetalhe = aNomesCampoDetalhe;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public CPersistenciaBd getPertinenciaBdMestre() {
        return fPertinenciaBdMestre;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public int[] getValoresIdMestre() {
        return fValoresIdMestre;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public String[] getNomesCampoMestre() {
        return fNomesCampoMestre;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public String[] getNomesCampoDetalhe() {
        return fNomesCampoDetalhe;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public String[] getComparacoes() {
        return fComparacoes;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public String[] getNomesCampoMestreHeranca() {
        return fNomesCampoMestreHeranca;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public String[] getNomesCampoDetalheHeranca() {
        return fNomesCampoDetalheHeranca;
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public void sincronizarMestre() {
        if (fPertinenciaBdMestre == null) {
            return;
        }
        fConjuntoDadosBd.recarregarConjuntoDados();

    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public void LerDados() {
    }

    ;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public void setNomeTabela(
            final String aNomeTabela,
            final String aAliasTabela) {
        fNomeTabela = aNomeTabela;
        if ((aAliasTabela == null) || (aAliasTabela.trim().equals(""))) {
            fAliasTabela = aNomeTabela;
        } else {
            fAliasTabela = aAliasTabela;
        }
    }

    public void setNomeChavePrimaria(final String aNomeChavePrimaria) {
        fNomeChavePrimaria = aNomeChavePrimaria;
    }

    public CConjuntoDadosBd getConjuntoDadosBd() {
        if (fConjuntoDadosBd == null) {
            fConjuntoDadosBd = new CConjuntoDadosBd(fGlobal, this, true, true);
        }
        return fConjuntoDadosBd;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void iniciarEdicao(final EStatusOperacao aStatusOperacao) {
        fStatusOperacao = aStatusOperacao;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    protected String getCampoLookup(CEstruturaCampoRegistroBdLookup e) {
        String vTab = e.getNomeTabelaLookup();
        String vId = e.getNomeBd();
        String vIdLookup = e.getNomeChavePrimariaLookup();
        String vAlias = e.getAliasTabelaLookup();
        String vDesc = e.getNomeCampoDescricaoLookup();
        Object vCond = e.getCondicaoLookup();
        String vSelect =
                "(select " + vAlias + "." + vDesc
                + " from " + vTab + " as " + vAlias
                + " where " + vAlias + "." + vIdLookup + " = "
                + fAliasTabela + "." + vId + ") as " + vAlias + "_" + vDesc;
        return vSelect;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public String nomesCamposSeparadosVirgula(final int aIndiceNomeCampo) {
        String vNomesCampos = "";
        int vNumCampos = fEstruturaRegistroBd.getNumCamposRegistroBd();
        String vSeparador = "";
        CEstruturaCampoRegistroBd vEstruturaCampoRegistroBd = null;
        for (int vContador = 0; vContador < vNumCampos; vContador++) {
            vEstruturaCampoRegistroBd = fEstruturaRegistroBd.getEstruturaCampoRegistroBd(vContador);
            boolean vAtende = false;
            switch (aIndiceNomeCampo) {
                case 1: {
                    vAtende = vEstruturaCampoRegistroBd.getSelect();
                    break;
                }
                case 2: {
                    vAtende = vEstruturaCampoRegistroBd.getInsert();
                    break;
                }
                case 3: {
                    vAtende = vEstruturaCampoRegistroBd.getUpdate();
                    break;
                }
                case 4: {
                    vAtende = vEstruturaCampoRegistroBd.getRelatorio();
                    break;
                }
            }
            if (vAtende) {
                String vAlias = "";
                if ((aIndiceNomeCampo == 1) || (aIndiceNomeCampo == 4)) {
                    vAlias = fAliasTabela + ".";
                }
                vNomesCampos =
                        vNomesCampos
                        + vSeparador
                        + vAlias + vEstruturaCampoRegistroBd.getNomeBd();
                switch (aIndiceNomeCampo) {
                    case 1: {
                        if (vEstruturaCampoRegistroBd instanceof CEstruturaCampoRegistroBdLookup) {
                            final CEstruturaCampoRegistroBdLookup e = (CEstruturaCampoRegistroBdLookup) vEstruturaCampoRegistroBd;
                            String vSelect = getCampoLookup(e);
                            vNomesCampos = vNomesCampos + vSeparador + vSelect;
                        }
                        break;
                    }
                    case 2: {
                        break;
                    }
                    case 3: {
                        break;
                    }
                    case 4: {
                        if (vEstruturaCampoRegistroBd instanceof CEstruturaCampoRegistroBdLookup) {
                            final CEstruturaCampoRegistroBdLookup e = (CEstruturaCampoRegistroBdLookup) vEstruturaCampoRegistroBd;
                            String vSelect = getCampoLookup(e);
                            vNomesCampos = vNomesCampos + vSeparador + vSelect;
                        }
                        break;
                    }
                }
                if (aIndiceNomeCampo == 4) {
                }
                vSeparador = ",";
            }
        }
        return vNomesCampos;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public String valoresCamposSeparadosVirgula(
            final int aIndiceNomeCampo, final CRegistroBd aRegistroBd, final boolean aEstiloUpdate) {
        //
        final String vNomeCampoPk = fEstruturaRegistroBd.getNomeChavePrimaria().toUpperCase();
        String vValoresCampos = "";
        int vNumCampos = fEstruturaRegistroBd.getNumCamposRegistroBd();
        String vSeparador = "";
        CEstruturaCampoRegistroBd vEstruturaCampoRegistroBd = null;
        for (int vContador = 0; vContador < vNumCampos; vContador++) {
            vEstruturaCampoRegistroBd = fEstruturaRegistroBd.getEstruturaCampoRegistroBd(vContador);
            boolean vAtende = false;
            switch (aIndiceNomeCampo) {
                case 1: {
                    vAtende = vEstruturaCampoRegistroBd.getSelect();
                    break;
                }
                case 2: {
                    vAtende = vEstruturaCampoRegistroBd.getInsert();
                    break;
                }
                case 3: {
                    vAtende = vEstruturaCampoRegistroBd.getUpdate();
                    break;
                }
            }
            if (vAtende) {
                //((!aCampoGrade) && (!vEstruturaCampoRegistroBd.getCampoGradeBd())) ||
                //((aCampoGrade) && (vEstruturaCampoRegistroBd.getCampoGradeBd()))) {
                String vValorStr = null;
                String vDelimitador = "";
                Component vComponente = vEstruturaCampoRegistroBd.getComponente();
                Object o = aRegistroBd.getCampoRegistroBdComponente(vComponente);
                CCampoRegistroBd cr = (CCampoRegistroBd) o;
                if (vEstruturaCampoRegistroBd instanceof CEstruturaCampoRegistroBdLookup) {
                    if (vComponente instanceof JComboBox) {
                        JComboBox cb = (JComboBox) vComponente;
                        Vector vReg = (Vector) cb.getSelectedItem();
                        vValorStr = vReg.get(0).toString();
                    }
                } else {
                    if (cr == null) {
                        vValorStr = null;
                    } else {
                        vValorStr = cr.getValorCampoBdStr();
                    }
                }
                if (vValorStr == null) {
                    if (!aEstiloUpdate) {
                        vValorStr = "null";
                        switch (aIndiceNomeCampo) {
                            case 1: {
                                vAtende = vEstruturaCampoRegistroBd.getSelect();
                                break;
                            }
                            case 2: {
                                vAtende = vEstruturaCampoRegistroBd.getInsert();
                                final String s = vEstruturaCampoRegistroBd.getNomeBd().toUpperCase();
                                if ((s != null) && (s.equals(vNomeCampoPk))) {
                                    vValorStr = "123";
                                }
                                break;
                            }
                            case 3: {
                                vAtende = vEstruturaCampoRegistroBd.getUpdate();
                                break;
                            }
                        }
                    }
                } else {
                    if (vEstruturaCampoRegistroBd.getTipoCampo() == ETipoCampoBd.texto) {
                        vDelimitador = "'";
                    } else if (vEstruturaCampoRegistroBd.getTipoCampo() == ETipoCampoBd.data) {
                        vDelimitador = "";
                        vValorStr = "str_to_date('" + vValorStr + "','%d/%m/%Y')";
                        //vValorStr = "date_format('" + vValorStr + "','%d/%m/%Y')";
                    } else if (vEstruturaCampoRegistroBd.getTipoCampo() == ETipoCampoBd.hora) {
                        vDelimitador = "";
                        vValorStr = "str_to_date('00/00/0000 " + vValorStr + "','%d/%m/%Y %H:%i:%s')";
                        //vValorStr = "date_format('00/00/0000 " + vValorStr + "','%d/%m/%Y')";
                    } else if (vEstruturaCampoRegistroBd.getTipoCampo() == ETipoCampoBd.datahora) {
                        vDelimitador = "";
                        vValorStr = "str_to_date('" + vValorStr + "','%d/%m/%Y %H:%i:%s')";
                        //vValorStr = "date_format('" + vValorStr + "','%d/%m/%Y %H:%i:%s')";
                    }
                    vValorStr = vDelimitador + vValorStr + vDelimitador;
                    if (aEstiloUpdate) {
                        if (cr.getIgualOriginal()) {
                            vValorStr = null;
                        } else {
                            vValorStr = vEstruturaCampoRegistroBd.getNomeBd() + " = " + vValorStr;
                        }
                    }
                }
                if (vValorStr != null) {
                    vValoresCampos = vValoresCampos + vSeparador + vValorStr;
                    vSeparador = ",";
                }
            }
        }
        return vValoresCampos;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    /**
     * retorna a sentença SQL para update dos dados editados no painel
     * de edição, após o pressionamento do botão salvar.
     * @param aNomeCampo Nome do campo no banco de dados.
     * @param aGrade Indica se apenas camposd e grande devem ser selecionados.
     */
    /*
    public String getQuerySelecionar(int aIndiceNomeCampo) {
    String vNomesCampos = nomesCamposSeparadosVirgula(aIndiceNomeCampo);
    String vCondicao = "";
    String vSep = "";
    /*
    if (aGrade)
     */
    /*
    if (fNomesCampoDetalhe == null)
    vCondicao = "(1=1)";
    else {
    if (fPertinenciaBdMestre == null) {
    for (int i = 0; i < fNomesCampoDetalhe.length; i++) {
    vCondicao = vCondicao + vSep + "(" + fNomesCampoDetalhe[i] + " = " + fValoresIdMestre[i] + ")";
    vSep = "&&";
    }
    }
    else {
    for (String vNomeCampoMestre : fNomesCampoMestre) {
    CRegistroBd r = fPertinenciaBdMestre.getConjuntoDadosBd().getRegistroBdAtual();
    CCampoRegistroBd c = r.getCampoRegistroBd(vNomeCampoMestre);
    String vValorStr = c.getValorCampoBdStr();
    vCondicao = vCondicao + vSep + "(" + vNomeCampoMestre + " = " + vValorStr + ")";
    vSep = "&&";
    }
    }
    }
     */
    /*
    else {
    switch (fStatusOperacao) {
    case inclusao: {
    break;
    }
    case alteracao: {
    vCondicao = fNomeChavePrimaria + " " + fValorChavePrimaria;
    break;
    }
    case exclusao: {
    break;
    }
    }
    }
     *
     */
    /*
    String vSentencaSql =
    "select " +
    vNomesCampos +
    " from " +
    fNomeTabela +
    " where " +
    vCondicao;
    return vSentencaSql;
    }
     */
    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    /**
     * Retorna o texto da sentença para a seleção do conjunto de dados.
     * @param aNomeCampo
     * @return texto da sentença completa para seleção do conjunto de dados.
     */
    public String getQuerySelecionarCamposRegistroBd(final int aIndiceNomeCampo) {
        String vCondicaoStr = null;
        String vSep = "";
        Object vObjCondicao = fEstruturaRegistroBd.getCondicao();
        if (fNomesCampoDetalhe != null) {
            if (fPertinenciaBdMestre == null) {
                for (int i = 0; i < fNomesCampoDetalhe.length; i++) {
                    if (vCondicaoStr == null) {
                        vCondicaoStr = "";
                    }
                    vCondicaoStr = vCondicaoStr + vSep + "(" + fNomesCampoDetalhe[i] + " = " + fValoresIdMestre[i] + ")";
                    vSep = "&&";
                }
            } else {
                CRegistroBd r = fPertinenciaBdMestre.getConjuntoDadosBd().getRegistroBdAtual();
                if (r == null) {
                    vCondicaoStr = "(" + fNomesCampoDetalhe[0] + " = 0)";
                } else {
                    for (int i = 0; i < fNomesCampoDetalhe.length; i++) {
                        if (vCondicaoStr == null) {
                            vCondicaoStr = "";
                        }
                        CCampoRegistroBd c = r.getCampoRegistroBd(fNomesCampoMestre[i]);
                        if (c == null) {
                            vCondicaoStr = vCondicaoStr + vSep + "(" + fNomesCampoDetalhe[i] + " is null)";
                        } else {
                            String vValorStr = c.getValorCampoBdStr();
                            ETipoCampoBd vTipo = c.getEstruturaCampoRegistroBd().getTipoCampo();
                            if (vTipo == ETipoCampoBd.texto) {
                                vValorStr = "'" + vValorStr + "'";
                            } else if (vTipo == ETipoCampoBd.data) {
                                vValorStr = "str_to_date('" + vValorStr + "','%d/%m/%Y')";
                            }
                            vCondicaoStr = vCondicaoStr + vSep + "(" + fNomesCampoDetalhe[i] + fComparacoes[i] + vValorStr + ")";
                        }
                        vSep = "&&";
                    }
                }
            }
        }
        if (vObjCondicao != null) {
            if ((vCondicaoStr == null) || vCondicaoStr.equals("")) {
                vCondicaoStr = "(" + vObjCondicao.toString() + ")";
            } else {
                vCondicaoStr = vCondicaoStr + " and (" + vObjCondicao.toString() + ")";
            }
        }
        String vSentencaSql = fEstruturaRegistroBd.getQuerySelecionar(vCondicaoStr);
        if (vSentencaSql == null) {
            String vNomesCampos = nomesCamposSeparadosVirgula(1);
            vSentencaSql =
                    "select ";
            if (isDistinto()) {
                vSentencaSql += "distinct ";
            }
            vSentencaSql +=
                    vNomesCampos
                    + " from "
                    + fNomeTabela + " as " + fAliasTabela;
            if ((vCondicaoStr != null) && (!vCondicaoStr.equals(""))) {
                vSentencaSql += " where " + vCondicaoStr;
            }
        }
        return vSentencaSql;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public String getQueryInserir(final CRegistroBd aRegistroBd) {
        String vNomesCampos = nomesCamposSeparadosVirgula(2);
        String vValoresCampos = valoresCamposSeparadosVirgula(2, aRegistroBd, false);
        String vQueryInserir =
                "insert into " + fNomeTabela
                + "(" + vNomesCampos + ") "
                + "values "
                + "(" + vValoresCampos + ")";
        return vQueryInserir;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public String getQueryAlterar(final CRegistroBd aRegistroBd) {
        String vValoresCampos = valoresCamposSeparadosVirgula(3, aRegistroBd, true);
        if (vValoresCampos.equals("")) {
            return null;
        }
        String vWhere = fEstruturaRegistroBd.getNomeChavePrimaria();
        vWhere = vWhere + " = " + aRegistroBd.getCampoRegistroBdChavePrimaria().getValorCampoBdStr();
        String vAlterar =
                "update " + fNomeTabela
                + " set " + vValoresCampos
                + " where " + vWhere;
        return vAlterar;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public String getQueryExcluir(CRegistroBd aRegistroBd) {
        String vWhere = fEstruturaRegistroBd.getNomeChavePrimaria();
        vWhere = vWhere + " = " + aRegistroBd.getCampoRegistroBdChavePrimaria().getValorCampoBdStr();
        final String vExcluir =
                "delete from " + fNomeTabela + " where " + vWhere;
        return vExcluir;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    CEstruturaCampoRegistroBd getEstruturaCampoRegistroBd(final String aNomeCampo) {
        String vNomeCampo = aNomeCampo;
        CEstruturaCampoRegistroBd vEstruturaCampoRegistroBd = null;
        int vNumCampos = fEstruturaRegistroBd.getNumCamposRegistroBd();
        for (int vContador = 0; ((vContador < vNumCampos) || (vEstruturaCampoRegistroBd != null)); vContador++) {
            vEstruturaCampoRegistroBd = fEstruturaRegistroBd.getEstruturaCampoRegistroBd(vContador);
            if (!vEstruturaCampoRegistroBd.getNomeBd().toLowerCase().equals(vNomeCampo)) {
                vEstruturaCampoRegistroBd = null;
            }
        }
        return vEstruturaCampoRegistroBd;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public int prepararEdicao(final ResultSet aRs) {
        int vResultado = -1;
        int vNumCampos = fEstruturaRegistroBd.getNumCamposRegistroBd();
        String vValorCampo = null;
        CEstruturaCampoRegistroBd vEstruturaCampoRegistroBd = null;
        for (int vContador = 0; vContador < vNumCampos; vContador++) {
            vEstruturaCampoRegistroBd = fEstruturaRegistroBd.getEstruturaCampoRegistroBd(vContador);
            if (aRs == null) {
                vValorCampo = null;
            } else {
                try {
                    vValorCampo = aRs.getString(vEstruturaCampoRegistroBd.getNomeBd());
                } catch (SQLException ex) {
                    vValorCampo = null;
                }
            }
            vEstruturaCampoRegistroBd.setValorOriginalCampoRegistroBd(vValorCampo);
            vResultado = 1;
        }
        return vResultado;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public int atribuirValoresOriginaisCamposDialogo(final boolean aRestaurarValoresOriginais) {
        int vResultado = 0;
        if (fConjuntoDadosBd == null) {
            return -1;
        }
        if (aRestaurarValoresOriginais) {
            vResultado = prepararEdicao(null);
        } else {
            ResultSet vRs = fConjuntoDadosBd.execSelect(
                    getQuerySelecionarCamposRegistroBd(1), null, "");
            if (vRs == null) {
                vResultado = 0;
            } else {
                try {
                    while (vRs.next()) {
                        prepararEdicao(vRs);
                    }
                    vResultado = 1;
                } catch (SQLException ex) {
                    Logger.getLogger("x").log(Level.SEVERE, null, ex);
                    vResultado = -2;
                }
                try {
                    vRs.close();
                    vResultado = 1;
                } catch (SQLException ex) {
                    vResultado = -3;
                    Logger.getLogger(CPersistenciaBd.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return vResultado;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void incluir() {
        fStatusOperacao = EStatusOperacao.inclusao;
        //atribuirValoresOriginaisCamposDialogo(false);
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void alterar() {
        fStatusOperacao = EStatusOperacao.alteracao;
        //atribuirValoresOriginaisCamposDialogo();
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CResultadoGravacao gravar(final CRegistroBd aRegistroBd) {
        int vResultadoExec = 0;
        int vResultado = 0;
        if (fGlobal == null) {
            return null;
        }
        fConjuntoDadosBd.eventoAntesMoverRegistro();
        CResultadoGravacao vResultadoRetorno = new CResultadoGravacao();
        switch (fStatusOperacao) {
            case inclusao: {
                vResultadoExec = fConjuntoDadosBd.execUpdate(
                        getQueryInserir(aRegistroBd), null, "");
                vResultado = vResultadoExec;
                if (vResultado > -1) {
                    ResultSet rs = null;
                    try {
                        CConectorBd c = null;
                        Statement s = fGlobal.getStatement();
                        rs = s.getGeneratedKeys();
                    } catch (SQLException ex) {
                        rs = null;
                    }
                    if (rs != null) {
                        boolean vGerou = false;
                        try {
                            vGerou = rs.first();
                        } catch (SQLException ex) {
                            vResultado = 0;
                        }
                        if ((rs != null) && (vGerou)) {
                            try {
                                vResultado = rs.getInt(1);
                            } catch (SQLException ex) {
                                vResultado = 0;
                            }
                        }
                    }
                }
                break;
            }
            case alteracao: {
                String vQuery = getQueryAlterar(aRegistroBd);
                if (vQuery != null) {
                    vResultadoExec = fConjuntoDadosBd.execUpdate(vQuery, null, "");
                } else {
                    vResultadoExec = 0;
                }
                vResultado = vResultadoExec;
                break;
            }
            case exclusao: {
                String vQuery = getQueryExcluir(aRegistroBd);
                if (vQuery != null) {
                    vResultadoExec = fConjuntoDadosBd.execUpdate(vQuery, null, "");
                } else {
                    vResultadoExec = 0;
                }
                vResultado = vResultadoExec;
                break;
            }
        }
        vResultadoRetorno.setResultado(vResultado);
        try {
            Statement s = fGlobal.getStatement();
            vResultadoRetorno.setResultSet(s.getResultSet());
        } catch (SQLException ex) {
            if (fGlobal.isLogVerboso()) {
                Logger.getLogger(CPersistenciaBd.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        fConjuntoDadosBd.eventoDepoisGravarRegistro(aRegistroBd, fStatusOperacao, vResultadoExec);
        return vResultadoRetorno;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public int salvar() {
        int vResultado = -1;
        //if (fStatusOperacao == EStatusOperacao.alteracao)
        //atribuirValoresOriginaisCamposDialogo(false);
        fStatusOperacao = EStatusOperacao.consulta;
        return vResultado;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void cancelar() {
        if (fStatusOperacao == EStatusOperacao.alteracao) {
            atribuirValoresOriginaisCamposDialogo(true);
        }
        fStatusOperacao = EStatusOperacao.consulta;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void excluir() {
        fStatusOperacao = EStatusOperacao.exclusao;
        //atribuirValoresOriginaisCamposDialogo();
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void carregarConjuntoDadosBd() {
        final CConjuntoDadosBd vConjuntoDadosBd = getConjuntoDadosBd();
        if (vConjuntoDadosBd != null) {
            vConjuntoDadosBd.carregarConjuntoDados();
        }
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void recarregarConjuntoDadosBd() {
        final CConjuntoDadosBd vConjuntoDadosBd = getConjuntoDadosBd();
        if (vConjuntoDadosBd != null) {
            vConjuntoDadosBd.recarregarConjuntoDados();
        }
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public EStatusOperacao getStatusOperacao() {
        return fStatusOperacao;
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void setLiberarEdicao(final boolean aLiberarEdicao, final boolean aIgualOriginal) {
        if (fEstruturaRegistroBd == null) {
            return;
        }
        CEstruturaCampoRegistroBd vEstruturaCampoRegistroBd = null;
        int vNumCampos = fEstruturaRegistroBd.getNumCamposRegistroBd();
        for (int vContador = 0; vContador < vNumCampos; vContador++) {
            vEstruturaCampoRegistroBd = fEstruturaRegistroBd.getEstruturaCampoRegistroBd(vContador);
            if (vEstruturaCampoRegistroBd.getCampoEditavel()) {
                vEstruturaCampoRegistroBd.setEditar(aLiberarEdicao, aIgualOriginal);
            } else {
                vEstruturaCampoRegistroBd.setEditar(false, false);
            }
        }
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public int getNumCamposCabecalhoBd() {
        return fEstruturaRegistroBd.getNumCamposCabecalhoRegistroBd();
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public void relatorioBasico(final CRelatorioBasico aRelatorio) {
        String vQuery = getQuerySelecionarCamposRegistroBd(4);
        aRelatorio.query(vQuery);
        int vNumCampos = fEstruturaRegistroBd.getNumCamposRegistroBd();
        for (int vContador = 0; vContador < vNumCampos; vContador++) {
            CEstruturaCampoRegistroBd e = fEstruturaRegistroBd.getEstruturaCampoRegistroBd(vContador);
            if (e.getRelatorio()) {
                if (e instanceof CEstruturaCampoRegistroBdLookup) {
                    CEstruturaCampoRegistroBdLookup el = (CEstruturaCampoRegistroBdLookup) e;
                    aRelatorio.campoTextoDetalhe(
                            el.getTitulo(),
                            el.getAliasNomeCampoDescricaoLookup(),
                            java.lang.String.class,
                            null,
                            //JRAlignment.HORIZONTAL_ALIGN_LEFT,
                            null,
                            e.fPosicaoColunaRelatorio,
                            e.fLarguraColunaRelatorio);
                } else {
                    switch (e.getTipoCampo()) {
                        case data: {
                            aRelatorio.campoTextoDetalhe(
                                    e.getTitulo(),
                                    e.getNomeBd(),
                                    "dd.MM.yyyy",
                                    java.util.Date.class,
                                    null,
                                    //JRAlignment.HORIZONTAL_ALIGN_LEFT,
                                    null,
                                    e.fPosicaoColunaRelatorio,
                                    e.fLarguraColunaRelatorio);
                            break;
                        }
                        case hora: {
                            aRelatorio.campoTextoDetalhe(
                                    e.getTitulo(),
                                    e.getNomeBd(),
                                    "hh:mm",
                                    java.sql.Time.class,
                                    null,
                                    //JRAlignment.HORIZONTAL_ALIGN_LEFT,
                                    null,
                                    e.fPosicaoColunaRelatorio,
                                    e.fLarguraColunaRelatorio);
                            break;
                        }
                        default: {
                            aRelatorio.campoTextoDetalhe(
                                    e.getTitulo(),
                                    e.getNomeBd(),
                                    java.lang.String.class,
                                    null,
                                    //JRAlignment.HORIZONTAL_ALIGN_LEFT,
                                    null,
                                    e.fPosicaoColunaRelatorio,
                                    e.fLarguraColunaRelatorio);
                        }
                    }
                }
            }
        }
    }
    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
}
